/**
 * 各种公式计算工具类
 * 包含股票涨跌停、数理化公式等计算
 */

/**
 * 股票相关公式
 */
class StockFormulas {
  /**
   * 计算股票涨停价格
   * @param {number} principal - 初始本金
   * @param {number} days - 连续涨停天数
   * @param {number} limitUpRate - 涨停幅度(默认10%)
   * @returns {number} 涨停价格
   */
  static limitUp(principal, days, limitUpRate = 0.1) {
    const finalAmount = principal * Math.pow(1 + limitUpRate, days)
    const profit = finalAmount - principal

    return {
      finalAmount: finalAmount.toFixed(2),
      profit: profit.toFixed(2),
      profitRate: `${((profit / principal) * 100).toFixed(2)}%`
    }
  }

  /**
   * @param {number} principal - 初始本金
   * @param {number} days - 连续跌停天数
   * @param {number} limitDownRate - 跌停幅度(默认10%)
   * @returns {number} 跌停价格
   */
  static limitDown(principal, days, limitDownRate = 0.1) {
    const finalAmount = principal * Math.pow(1 - limitDownRate, days)
    const loss = principal - finalAmount

    return {
      finalAmount: finalAmount.toFixed(2),
      loss: loss.toFixed(2),
      lossRate: `${((loss / principal) * 100).toFixed(2)}%`
    }
  }

  /**
   * 计算收益率
   * @param {number} buyPrice - 买入价格
   * @param {number} sellPrice - 卖出价格
   * @returns {number} 收益率（小数形式）
   */
  static returnRate(buyPrice, sellPrice) {
    return (sellPrice - buyPrice) / buyPrice
  }
}

/**
 * 数学公式类
 */
class MathFormulas {
  /**
   * 二次方程求根公式
   * ax^2 + bx + c = 0
   * @param {number} a - 二次项系数
   * @param {number} b - 一次项系数
   * @param {number} c - 常数项
   * @returns {Object|null} 包含根的对象，无解时返回null
   */
  static quadraticFormula(a, b, c) {
    const discriminant = b * b - 4 * a * c

    if (discriminant < 0) {
      return null // 无实数解
    } else if (discriminant === 0) {
      const root = -b / (2 * a)
      return { root1: root, root2: root }
    } else {
      const root1 = (-b + Math.sqrt(discriminant)) / (2 * a)
      const root2 = (-b - Math.sqrt(discriminant)) / (2 * a)
      return { root1, root2 }
    }
  }

  /**
   * 阶乘计算
   * @param {number} n - 正整数
   * @returns {number} n的阶乘
   */
  static factorial(n) {
    if (n <= 1) return 1
    return n * this.factorial(n - 1)
  }
}

/**
 * 物理公式类
 */
class PhysicsFormulas {
  /**
   * 计算速度 (v = s/t)
   * @param {number} distance - 距离
   * @param {number} time - 时间
   * @returns {number} 速度
   */
  static velocity(distance, time) {
    return distance / time
  }

  /**
   * 计算力 (F = ma)
   * @param {number} mass - 质量
   * @param {number} acceleration - 加速度
   * @returns {number} 力
   */
  static force(mass, acceleration) {
    return mass * acceleration
  }
}

/**
 * 化学公式类
 */
class ChemistryFormulas {
  /**
   * 理想气体状态方程 (PV = nRT)
   * @param {number} pressure - 压强
   * @param {number} volume - 体积
   * @param {number} moles - 物质的量
   * @param {number} temperature - 温度（开尔文）
   * @returns {number} 理想气体常数计算值
   */
  static idealGasLaw(pressure, volume, moles, temperature) {
    // 返回 PV/(nT) 的值，理论上应等于气体常数R
    return (pressure * volume) / (moles * temperature)
  }
}

// 导出所有公式类
export { StockFormulas, MathFormulas, PhysicsFormulas, ChemistryFormulas }

const limit = StockFormulas.limitUp(100, 1, 99)
console.log('🚀 ~ limit:', limit)

const down = StockFormulas.limitDown(100, 1, 0.9)
console.log('🚀 ~ down:', down)
